#include "mprpcconfig.h"
#include<iostream>

 //负责解析加载配置文件
 void MprpcConfig::LoadConfigFile(const char*config_file)
 {
        FILE *pf = fopen(config_file,"r");
        if(nullptr == pf)
        {
            std::cout<<config_file<<"is not exits"<<std::endl;
            exit(EXIT_FAILURE);
        }
        //三种情况 1、注释 2、正确的配置项 3、去掉多余的空格
        while(!feof(pf))//测试给定的文件流是否已经达到了文件结束符
        {
            char buf[512] = {0};
            fgets(buf,512,pf);

            //去掉字符串前边的空格
            std::string read_buf(buf);
            Trim(read_buf);

            //判断#的注释
            if(read_buf[0]=='#'||read_buf.empty())
            {
                continue;
            }

            //解析配置项
            std::string key;
            std::string value;
            int idx=read_buf.find('=');
            if(idx==-1)
            {
                //配置不合法
                continue;
            }
            key=read_buf.substr(0,idx);
            Trim(key);
            //对于value来说还需要找到回车换行在那个地方
            int endidx=read_buf.find('\n',idx);
            value=read_buf.substr(idx+1,endidx-idx-1);
            Trim(value);
            m_configMap.insert({key,value});

        }
 }
 //查询配置项信息,传入一个key，返回该key所对应的字符串
 std::string MprpcConfig::Load(const std::string &key)
 {
    //这里不能直接return m_configMap[key];因为如果key不存在的话，它会给map表里面增加东西的
    auto it=m_configMap.find(key);
    if(it == m_configMap.end())
    {
        return " ";
    }

    return it->second; 
 }

 //去掉字符串前后的空格
 void MprpcConfig::Trim(std::string &src_buf)
 {
    int idx=src_buf.find_first_not_of(' ');
    if(idx!=-1)
    {
        //说明字符串前面有空格，即存在有效內容
        src_buf = src_buf.substr(idx,src_buf.size()-idx);
    }
    //去掉字符串后面多余的空格
    idx=src_buf.find_last_not_of(' ');
    if(idx!=-1)
    {
        src_buf=src_buf.substr(0,idx+1);
    }
 }
